package app.displayTree.special.sub
{
    import app.displayTree.analyze.DisplayTreeAnalyzeSupport;

    import copyengine.infoTree.meta.CESAnimationEachFrameInfoMeta;
    import copyengine.infoTree.meta.CESDisplayObjectMeta;
    import copyengine.infoTree.meta.CESPlaceHolderMeta;

    import flash.display.Sprite;
    import flash.geom.Matrix;
    import flash.geom.Rectangle;

    import org.as3commons.lang.StringUtils;

    public final class PlaceHolderSpecialSymbol extends SpecialSymbolHandleBasic
    {
        public function PlaceHolderSpecialSymbol()
        {
            super();
        }

        override protected function isCanHandleThisSpecialSymbolKey(_symbolKey:String):Boolean
        {
            return StringUtils.startsWithIgnoreCase(_symbolKey, "PH_");
        }

        override protected function doGenerateSpecialSymbolMeta(_symbol:Sprite, _support:DisplayTreeAnalyzeSupport):CESDisplayObjectMeta
        {
            var phMeta:CESPlaceHolderMeta = new CESPlaceHolderMeta();
            phMeta.name = _symbol.name;
            phMeta.isBuildDisplayObject = true;

            var symbolRe:Rectangle = _symbol.getBounds(_symbol.parent);

            var frameInfo:CESAnimationEachFrameInfoMeta = new CESAnimationEachFrameInfoMeta();
            var frameMatrix:Matrix = new Matrix();
            frameMatrix.translate(_symbol.x, _symbol.y);

            frameInfo.setMatrix(frameMatrix);
            phMeta.frameTransformMatrixArray.push(frameInfo);

            phMeta.width = symbolRe.width;
            phMeta.height = symbolRe.height;
            phMeta.alpha = _symbol.alpha;

            //PH对象的原点坐标不一定为(0,0) 如果仅仅是采用CenterFill函数将某个对象居中填充到PH之中 此时无论将PH放置在何处都可以
            //（指的是无论按照显示树中的位置方式,还是预先把偏移值移动到矩阵内部），但是如果上层逻辑是取得PH的(x,y)值再进行相应操作
            //比如以PH的x,y为原点画一个圆,这样则因为预先把偏移值计算到矩阵内部中,外部取得的x,y值就不对了
            phMeta.offsetX = symbolRe.left - _symbol.x;
            phMeta.offsetY = symbolRe.top - _symbol.y;

            //全局的位置信息,这样就可以把PH嵌套在Mc里面使用,因为Node节点是不会创建对应的Mc
            //所以PH并不在显示列表中 无法使用LocalToGlobal函数 这样的话 如果Node是嵌套在某个mc
            //内部的话 返回的x,y信息是相对于该mc的 ( 因为使用的是_symbol.getBounds(_symbol.parent) )
            //所以需要记录改Node节点的Global信息
            var symbolGlobalRe:Rectangle = _symbol.getBounds(_symbol.stage);
            phMeta.globalLeft = symbolGlobalRe.left;
            phMeta.globalTop = symbolGlobalRe.top;
            phMeta.globalX = symbolGlobalRe.x;
            phMeta.globalY = symbolGlobalRe.y;

            return phMeta;
        }
    }
}
